Data Viz Palette
Six cool categorical hues anchored on slate and switch, single-hue sequential ramps, a slate ↔ coral diverging scale, and a 10-step slate → switch gradient for many-series stacks. All channels share a lightness curve so series read as one fabric.
Six cool hues, anchored on slate and switch. Built as one tonal family rather than a hue wheel — every series lives between deep slate and cyan-teal so a chart reads as one fabric. Use in order: --viz-slate for the primary series, --viz-switch for the comparator, then deep → steel → mist → graphite. Past 6 series, switch to a sequential ramp or the many-series stack gradient below.
Seven-step ramps with a shared lightness curve. Use for ordered magnitude — fill rate, density, percent-to-goal. Slate is the default; switch and warm offer an alternate temperature when slate would collide with brand chrome.
A 10-step gradient from deep slate to light switch-cyan, anchored at both ends on brand tokens. Use when one automation or campaign breaks into 10+ near-identical slices that would overwhelm the categorical palette — treatment × region variants, ad-group splits, A/B/n cohorts. Darkest slate sits at the top of the stack so the dominant slice anchors the chart. --stack-other rides on top in graphite for the catch-all bucket.
Nine-step diverging scale for plus/minus data — pacing variance, win-rate delta, lift over baseline. Luminance + chroma carry polarity instead of warm/cool, so the scale stays entirely in the slate / switch family. Deep slate reads "below," bright cyan reads "above," near-bg midpoint stays out of the way. For unambiguous good/bad (where red/green is meaningful), reach for the semantic --success / --error tokens instead.
Status colors are not categorical. Reuse the existing semantic tokens for state-bearing visualizations (uptime ribbons, run-state tiles, alert sparklines) so dashboards align with form validation and badge colors.
Usage notes
- Categorical first 3 are the comfort zone (slate → switch → deep). Past viz-4, audit the chart for fatigue. If you need a 7th series, switch to a sequential ramp or the many-series stack.
- Sequential ramps never mix. Pick slate, switch, or warm — don't pivot mid-dashboard. The lightness curve is shared, so a slate heatmap and a switch heatmap encode the same percent at the same step.
- Diverging is anchored at 0. Don't use it for ordered magnitude (use sequential); don't use it for categorical state (use status).
- Status is not a series. Don't pull
--errorinto a categorical chart just because the row is "bad" — encode state in shape, label, or annotation instead.